<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    一、JS的数据类型有哪些?
    基本类型：字符串(string)\数字(number)布尔(boolean)\空(Null)\未定义(undefined)\独一无二值(symbol)
    引用数据类型：对象(object)\数组(Array)\集合(set)映射(map)
    二、用过es6的哪些新特性? 1、const,let 2、模板字符串 3、箭头函数 4、解构赋值
    5、class类 6、for of || for in
    三、http请求中有哪些常见的状态码，他们分别表示什么意思? 200-206:请求成功
    300-307:重定向 4xx-http:请求出错，妨碍服务器的处理 400:请求错误 401:未授权
    403:静止访问 404:文件未找到 500-505:服务器尝试处理请求发生错误
    四、什么是跨域，跨域是怎么产生的，怎么解决跨域？
    浏览器不能执行其他网站的脚本，域名、协议、端口号只要有一个不同，就是跨域。
    跨域问题就是浏览器的同源策略造成的 (1)、CORS (2)、JSONP
    五、你知道那些数组方法？并表明哪些方法会改变原数组？ 1、不改变数组
    arr.slice()
    可从已有的数组中返回选定的元素，或者提取某个部分，以新的字符串返回提取值
    arr.map() 返回一个新数组，里的值为原始数组元素调用函数处理后的值
    arr.forEach() arr.every()
    使用指定函数检测数组所有元素是否符合指定条件,有一个不满足就false arr.some()
    使用指定函数检测数组所有元素是否符合指定条件,有一个满足就true
    arr.filter()创建一个新数组，新数组中的元素是通过检查指定数组符合条件的所有元素
    arr.reduce() arr.entries() arr.find() arr.concat() 连接两个或多个字符串
    2、改变原数组 arr.splice() 用于删除或者提娜佳数组中的元素 arr.reverse()
    反转,颠倒数组顺序 arr.fill() arr.copyWithin() arr.sort()
    对数组惊醒排序，默认按字母升序 arr.push()
    可向数组的末尾添加一个多个元素，并返回新的长度 arr.pop()
    用于删除数组的最后一个元素并返回删除的元素 arr.unshift()
    向数组的开头添加一个或多个元素，返回新的长度 arr.shift()
    用于把数组的第一个元素从其中删除，并返回第一个元素的值
    六、什么是闭包？以及优缺点？
    1、-是一个引用关系,存在于内部函数，引用的是外部函数的变量的对象 -
    函数内部套用外函数的变量,把内部函数作为外部函数的返回值
    2、优点:跨作用域访问变量（延长外部函数变量的生命周期）
    缺点:内存泄漏（内存无法释放）和内存溢出（内存被撑爆） 七、数组去重并排序 let
    a = [2,4,4,6,1,2,4,5,9,8] let b = [] for(let i = 0;i<a.length;i++){
    if(b.indexOf(a[i]<0)){ b.push(a[i]) } } b.sort() console.log(b);
    八、有一个url,'www.baidu.com?a=3&b=4'得到一个对象{a:3,b:4} function
    sjs(url){ let arr=url.split('?') let p=arr[1].split('&') let obj={} for(let
    i=0;i<p.length;i++){ let ap=p[i].split('=') obj[ap[0]] = ap[1] } return obj
    } console.log(sjs(' www.baidu.com?a=3&b=4')); 九、 console.log(1);
    setTimeout(()=>{ console.log(2); },0) new Promise((resolve)=>{
    console.log(3); // resolve(); }).then(()=>{ console.log(4); (大坑) })
    console.log(5); 结果:1352
    135同步、2异步宏任务(数组和系统发出的);异步微任务是javajs引擎发出的任务
    十、使用函数链式调用加减乘除 class myCalculator{ constructor(value){
    this.value = value } add(newValue){ this.value = this.value + newValue
    return this } minus(newValue){ this.value = this.value - newValue return
    this } multi(newValue){ this.value = this.value * newValue return this }
    div(newValue){ this.value = this.value / newValue return this } }
    console.log(myCalculator(121).add(1).minus(2).multi(3).div(4))
    十一、有一个数列1,2,5,26,677...,每一项是前一项的平方再加一，通过函数计算出第八个
    function sjs(a){ if(a<1){ return 1 }else{ return sjs(a-1)*sjs(a-1)+1 } }
    console.log(sjs(2))
    十二、使用promise封装一个delay的延迟函数,time为需要延迟的时间 function
    delay(time){ return new Promise(resolve=>{ setTimeout(resolve,delay) }) }
    delay(1000).then(()=>{ log(a) }) 十三、防抖和节流的概念,并手写一个防抖函数
    防抖:n秒内只运行一次,若在n秒内重复触发,只有一次生效
    节流:n秒后执行该事件,若在n秒内被重复触发,重新计时 a.oninput = (function () {
    let timer; return function () { clearTimeout(timer) timer = setTimeout(() =>
    { console.log('开始a'); }, 2000); } })() 十四、正则表达式 let a =
    /^s[(h|z)]{1}[0-9]{6}$/ console.log(a.test('sh123456'));
    十五、使用函数相同的对象合并，值相加 var arr = `[ { "id": "1","value":
    "1245" }, { "id": "1","value": "1360" }, { "id": "2", "value": "1120" }, {
    "id": "2","value": "1362" }, { "id": "2","value": "1008" }, { "id": "3",
    "value": "1360" }, { "id": "4","value": "1986" }, { "id": "4","value":
    "1240" } ]`; function sumByType(arr) { arr = JSON.parse(arr); let map = {},
    dest = []; for (var i = 0; i < arr.length; i++) { var ai = arr[i]; if
    (!map[ai.id]) { dest.push({ id: ai.id, value: ai.value }); map[ai.id] = ai;
    console.log(map) console.log(dest) } else { for (let j = 0; j < dest.length;
    j++) { let dj = dest[j]; if (dj.id == ai.id) { dj.value =
    (parseFloat(dj.value) + parseFloat(ai.value)).toString(); break; } } } }
    dest = JSON.stringify(dest); console.log(dest) } sumByType(arr);
  </body>
</html>
